#include <assert.h>
#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/sysctl.h>
typedef struct kinfo_proc kinfo_proc;
static int GetBSDProcessList(kinfo_proc **procList, size_t *procCount)
// ÉVÉXÉeÉÄè„ÇÃÇ∑Ç◊ǃÇà BSD ÉvÉçÉZÉXÇÃÉäÉXÉgÇï‘Ç∑
// DZÇÃÉãÅ[É`ÉìÇÕÅADZÇÃÉäÉXÉgÇÃäÑÇËìñǃÇçsǡǃ *procList Ç…ì¸ÇÍ
// ÉGÉìÉgÉäÇÃêîÇ *procCount Ç…ï‘Ç∑
// DZÇÃÉäÉXÉgÇÕé©ï™Ç≈âï˙ÇµÇ»ÇØÇÍnjǻÇÁǻǢÅiSystem ÉtÉåÅ[ÉÄÉèÅ[ÉNÇà free ÇégópÅj
// ê¨å˜éûÅAä÷êîÇÕ 0 Çï‘Ç∑
// ÉGÉâÅ[î≠ê∂éûÇ…ÇÕÅAä÷êîÇÕ BSD Çà errno ÇÃílÇï‘Ç∑
{
int err;
kinfo_proc * result;
bool done;
static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
// name Ç const ÇΔǵǃêÈåæÇ∑ÇÈÇÃÇ≈ÅAsysctl Ç…ìnÇ∑ÇΔÇ´Ç…ÉLÉÉÉXÉgÇ∑ÇÈïKóvǙdžÇÈ
// ÉvÉçÉgÉ^ÉCÉvÇ… const Ç™ä‹Ç‹ÇÍǃǢǻǢǩÇÁÇæ
size_t length;
assert( procList != NULL);
assert(*procList == NULL);
assert(procCount != NULL);
*procCount = 0;
// result == NULL ÇΔ length == 0 ÇΔǵǃ sysctl ÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊÇËäJénÅB
// DZÇÍÇÕê¨å˜ÇµÅAlength Ç™ìKêÿÇ»í∑Ç≥Ç…ê›íËÇ≥ÇÍÇÈÅB
// ǪÇÃå„ǪÇÃÉTÉCÉYÇÃÉoÉbÉtÉ@ÇäÑÇËìñǃÅAsysctl ÇçƒÇ—åƒÇ—èoÇ∑
// DZÇÍÇ™ê¨å˜Ç∑ÇÍÇŒèàóùÇÕèIóπÇ≈džÇÈÅBENOMEM ÉGÉâÅ[Ç≈é∏îsǵÇΩèÍçáÇÕ
// ÉoÉbÉtÉ@Çîjä¸ÇµÇƒÉãÅ[ÉvÇ∑ÇÈïKóvǙdžÇÈÅB
// DZÇÃÉãÅ[ÉvÇ≈ÇÕÅAçƒÇ— NULL ÇéwíËǵǃÅAsysctl ÇåƒÇ—èoÇ∑ïKóvǙdžÇÈDZÇΔÇ…íçà”ÅB
// DZÇÍÇÕïKóvÇ»èàóùÇ≈džÇÈÅBENOMEM ÉGÉâÅ[ÇÃèÍçáÅAlength ÇÕÅA
// ï‘Ç≥ÇÍÇÈÇ◊Ç´ÉfÅ[É^ó Ç≈ÇÕÇ»Ç≠
// ï‘Ç≥ÇÍÇΩÉfÅ[É^ó Ç…ê›íËÇ≥ÇÍÇÈÇ©ÇÁÇæ
result = NULL;
done = false;
do {
assert(result == NULL);
// ÉoÉbÉtÉ@Ç NULL Džǵǃ sysctl ÇåƒÇ—èoÇ∑
length = 0;
err = sysctl( (int *) name, (sizeof(name) / sizeof(*name)) - 1,
NULL, &length,
NULL, 0);
if (err == -1) {
err = errno;
}
// è„ãLÇÃåƒÇ—èoǵÇÃåãâ Ç…äÓÇ√Ç´ìKêÿÇ»ÉTÉCÉYÇÃ
// ÉoÉbÉtÉ@ÇäÑÇËìñǃÇÈ
if (err == 0) {
result = malloc(length);
if (result == NULL) {
err = ENOMEM;
}
}
// DZÇÃêVǵǢÉoÉbÉtÉ@Çégǡǃ sysctl ÇçƒÇ—åƒÇ—èoÇ∑
// ENOMEM ÉGÉâÅ[ÇéÛÇØéÊÇ¡ÇΩèÍçáÇÕÅAÉoÉbÉtÉ@Çîjä¸ÇµÇ‡Ç§àÍìxÇ‚ÇËíºÇ∑
if (err == 0) {
err = sysctl( (int *) name, (sizeof(name) / sizeof(*name)) - 1,
result, &length,
NULL, 0);
if (err == -1) {
err = errno;
}
if (err == 0) {
done = true;
} else if (err == ENOMEM) {
assert(result != NULL);
free(result);
result = NULL;
err = 0;
}
}
} while (err == 0 && ! done);
// ÉNÉäÅ[ÉìÉiÉbÉvèàóùÇçsÇ¢ÅAéñå„èÛë‘Çê›íËÇ∑ÇÈ
if (err != 0 && result != NULL) {
free(result);
result = NULL;
}
*procList = result;
if (err == 0) {
*procCount = length / sizeof(kinfo_proc);
}
assert( (err == 0) == (*procList != NULL) );
return err;
}
|